<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

</body>
<script>
    // 桶排序与分段类似，根据最大最小值确定范围，根据桶数量决定每个桶的范围，然后把数据放到对应范围的桶里，每个桶各自进行排序，最后再组合
    /**
     * 桶排序函数：将数组元素分配到有限数量的桶中，然后对每个桶进行排序并合并结果
     * @param {Array<number>} arr - 待排序的数组
     * @param {number} bucketNum - 桶的数量
     * @returns {Array<number>} - 排序后的数组
     */
    function bucketSort(arr,bucketNum){
        // 空数组直接返回
        if(arr.length === 0) return arr

        // 计算数组最小值和最大值
        const min = Math.min(...arr)
        const max = Math.max(...arr)

        // 所有元素相同的情况直接返回
        if(min === max) return arr
        bucketNum = bucketNum || arr.length
        // 计算每个桶的数值范围
        const bucketSize = (max - min) / bucketNum

        // 初始化桶数组
        const bucket = Array.from({length: bucketNum},_=>[])

        // 分配元素到对应的桶中
        for(let i = 0;i < arr.length;i++){
            // 计算元素应放入的桶索引
            let index = Math.floor((arr[i] - min) / bucketSize)

            // 处理最大值边界情况（防止索引越界）
            if (index === bucketNum){
                index = bucketNum - 1
            }

            bucket[index].push(arr[i])
        }

        // 合并所有桶并返回排序结果
        return bucket.reduce((acc,cur) => {
            // 对当前桶进行排序
            const temp = cur.sort((a,b)=>a-b)

            // 将排序后的桶元素合并到结果数组
            acc.push(...temp)
            return acc
        },[])
    }

    const arr1 = [0.78, 0.17, 0.39, 0.26, 0.72, 0.94, 0.21, 0.12, 0.23, 0.68];
    console.log(bucketSort(arr1,5));
</script>
</html>